import { loginAPI, getUserProfileAPI, getUserPhotoAPI } from '@/api'// 登入接口axios
import { getToken, setToken, removeToken } from '@/utils/auth'

// 面試：爲何本地存token，不直接使用本地token（在請求攔截器裏）
// 爲何要多次一舉，還要在vuex同步一份
// 本地也可以去本地拿，也可以像vuex一樣共享
// vuex是存在内存裏，取值更快，瀏覽器本地儲存是中存在磁盤裏（持久化）操作磁盤比較慢
// 定义token
const getDefaultState = () => {
  return {
    token: getToken(), // 用户token
    userInfo: {}// 获取用户信息
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: (state) => {
    // Object.assign()是把参数2往后的所有的对象key+value，赋值到一个参数的对象身上
    // getDefaultState（）调用后，拿到上面默认初始的state对象，给现有state对象重新覆盖值
    Object.assign(state, getDefaultState())
  },
  // 存取出token
  SET_TOKEN(state, newToken) {
    // state.上面取出token=新的赋值
    state.token = newToken
    setToken(newToken)
  },
  // 删除token，給個空字符串
  REMOVE_TOKEN(state) {
    state.token = ''
    removeToken()
  },
  // 存用户信息的值
  SET_USER(state, value) {
    state.userInfo = value
  },
  // 删取用户信息的值
  REMOVE_USERINFO(state) {
    state.userInfo = ''
  }
}

const actions = {
  //* **************************************************** */ 登录逻辑
  async loginActions({ commit }, value) {
    const [err, res] = await loginAPI(value)
    // 我们需要token，保存到上面的vuex中
    commit('SET_TOKEN', res.data)
    // 逻辑页面还在接收数组，外面写成功/失败的逻辑，所以这里要把数组返回出去
    // return到actions调用的地方（login/index。vue)
    return [err, res]
  },
  // *********************************************************获取用户信息
  // 默认第一个形参是store。以前store.commit（）
  // {commit}=store对象的结构赋值，把store对象里的commit方法直接赋予给左侧的{}了的commit变量
  async getUserInfoActions({ commit }, value) {
    const res = await getUserProfileAPI() // 获取用户基本资料对象
    // console.log(res)
    const user = await getUserPhotoAPI(res.data.userId)// 获取用户头像
    // console.log(user)
    // 都写在了用互信息了，因后端接口数据分开，导致两个接口，但现在要写在一起，只能追加载一起
    // 因此要这样写
    // res.data和user.data的两个队形里key+vlaue合并成一个对象
    // 如遇给userInfo保存（数据要来自于两个接口对象）
    commit('SET_USER', { ...res.data, ...user.data })// 保护用户基本信息
    // commit('SET_USER', res.data) // 保存到vuex的userInfo对象里
  },
  //* ********************************************************** */ 退出登入
  async logOutActions({ commit }) {
  // 清除token
    commit('REMOVE_TOKEN')
    commit('RESET_STATE')
  }
}
// ***********************************************************************************************************
// commit 触发mutations方法固定
// dispatch触发actions方法固定
// ***********************************************************************************************************
export default {
  namespaced: true,
  state,
  mutations,
  actions
}

